package ClasesDeApoyo;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import Grafo.Vertice;
import ROV.ROV;

public class Exportador 
{

	// -----------------------------------------------------------------
	// Atributos
	// -----------------------------------------------------------------


	/**
	 * Una variable que acumula el texto a exportar
	 */
	private String texto;

	/**
	 * El programa ROV que contiene todas las variables
	 */
	private ROV rov;

	// -----------------------------------------------------------------
	// Constructor
	// -----------------------------------------------------------------

	/**
	 * Metodo que construye un nuevo exportador
	 * @param ro el programa ROV con todas sus variables
	 */
	public Exportador(ROV ro)
	{
		texto = "\n" ;
		rov = ro;
	}


	// -----------------------------------------------------------------
	// Metodos
	// -----------------------------------------------------------------

	/**
	 * Metodo que actualiza el texto con un nuevo estado del ROV se invoca cuando se termina un caso
	 * <b>pre:</b> El String donde se esta escribiendo ya se encuentra inicializado <br>
     * <b>post:</b> Queda guardado en el String texto el reporte correspondiente al caso<br>
	 * @param i es el numero de caso que se evaluo
	 * @param vFinal es el vertice final del recorrido
	 * @param vInicial es el vertice inicial del recorrido
	 */
	public void actilizarResultado( int i, Vertice vFinal, Vertice vInicial) 
	{
		texto+= "Caso " + (i+1) + "\n";
		texto+= vInicial.getNombre() + " " + vFinal.getNombre() + " " + vInicial.getFechaMinimaSalida().toString() + "\n";
		texto += "----------" + "\n";
		if(vFinal.getFechaMinimaSalida()!=null)
		{
			boolean termino = false;
			int indiceCuestion = vInicial.getPosicionArreglo();
			while(!termino)
			{
				Vertice vActual = rov.getVertices()[indiceCuestion];
				Vertice vSiguiente = null;
				for(int j = 0;j< rov.getCaminoVertice().length -1 && rov.getCaminoVertice()[j] != indiceCuestion; )
				{
					
					j++; 
					vSiguiente = rov.getVertices()[j];
					
				}

				if(vSiguiente.equals(vFinal))
				{
					Fecha temp = new Fecha(vActual.getFechaMinimaSalida().getDia(), vActual.getFechaMinimaSalida().getHora(), vActual.getFechaMinimaSalida().getMinuto(), vActual.getFechaMinimaSalida().isSiguienteSemana());
					if(!vActual.equals(vInicial))
					{
						temp.restar(vActual.getDuracionEstacion());
					}

					texto += vActual.getNombre() + " " + temp.toString() + " ";  

					temp.sumar(vActual.getDuracionEstacion());
					temp.sumar(vActual.darMinutosHastaSalidaProximoTransporte(vSiguiente.getArcoUsado()));

					
					texto += temp.toStringSoloHora() +  "\n";

					temp = new Fecha(vSiguiente.getFechaMinimaSalida().getDia(), vSiguiente.getFechaMinimaSalida().getHora(), vSiguiente.getFechaMinimaSalida().getMinuto(), vSiguiente.getFechaMinimaSalida().isSiguienteSemana());
					if(!vSiguiente.equals(vInicial))
					{
						temp.restar(vSiguiente.getDuracionEstacion());
					}

					texto += vSiguiente.getNombre() + " " + temp.toString() + " " + temp.toStringSoloHora() +  "\n";

					termino = true;

				}
				else
				{

					Fecha temp = new Fecha(vActual.getFechaMinimaSalida().getDia(), vActual.getFechaMinimaSalida().getHora(), vActual.getFechaMinimaSalida().getMinuto(), vActual.getFechaMinimaSalida().isSiguienteSemana());
					if(!vActual.equals(vInicial))
					{
						temp.restar(vActual.getDuracionEstacion());
					}

					texto += vActual.getNombre() + " " + temp.toString() + " ";  

					temp.sumar(vActual.getDuracionEstacion());
					temp.sumar(vActual.darMinutosHastaSalidaProximoTransporte(vSiguiente.getArcoUsado()));

					texto += temp.toStringSoloHora() +  "\n";
					
					indiceCuestion = vSiguiente.getPosicionArreglo();


				}



			}


			texto += (Fecha.darDiferenciaMinutos(vInicial.getFechaMinimaSalida(), vFinal.getFechaMinimaSalida()) - vFinal.getDuracionEstacion()) + "\n";
		}
		else
		{
			texto += "No Solucion" + "\n";
			texto += "Infinito" + "\n";
		}

		texto += "--------------------" + "\n";

	}


	/**
	 * Metodo que exporta el texto a un documento especificado en la ruta
	 * <b>pre:</b> Todos los casos a analizar fueron terminados con exito <br>
     * <b>post:</b> El String con todos los reportes quedan guardados en el archivo especificado <br>
	 * @param ruta la ruta del decomuento a exportar
	 */
	public void Exportar(String ruta)
	{
		try 
		{
			if(ruta!=null)
			{
				PrintWriter pw = new PrintWriter(new FileWriter(new File(ruta)));
				pw.println(texto);
				pw.close();
			}
			System.out.println(texto);
		} catch (IOException e) 
		{
		
			e.printStackTrace();
		}

	}

}
